# Function

# 创建

  • Function

    var fun = new Function(形式参数列表,方法体);// 括号里面的都必须是string类型。忘掉吧!
    
  • 函数声明

    function 方法名称(形式参数列表){ 
        方法体
    }
    
  • 函数表达式

    var 方法名 = function(形式参数列表){ //匿名函数
        方法体
    }
    

方法定义时,形参的类型var不用写,返回值类型var也不写。

TIP

函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。

函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。

# 属性

length代表形参的个数

# 无函数重载 & arguments

  1. 在JavaScript中,方法的调用只与方法的名称有关,和参数列表无关(传递多少个参数无所谓)

  2. 方法是一个对象,如果定义名称相同的方法,会覆盖(可以从对象引用理解),所以没有函数重载

  3. 在方法声明中有一个隐藏的内置对象(数组)arguments封装所有的实际参数。同Java中可变参数类似

  4. 可以把传递的参数保存到 arguments数组里面来模拟函数重载

    var add = function(){
        let sum = 0;
        for(let i = 0;i<arguments.length;i++){
            sum+=arguments[i];
        }
        return sum;
    }
    

# 默认参数

function hello(name = "world") {
  console.log(name);
}
hello(); // world
hello(undefined); // world
hello(null); // null
hello("kitty"); // kitty

# 作用域

  • 在函数内部定义的变量只能在函数内部使用,ES6之前主要的作用域就是函数,其他查看“作用域和闭包”章节。

  • 函数内部变量与全局变量冲突则会覆盖全局变量

  • let 会在{}中自动生成一个局部作用域,var 没有这个作用

# 箭头函数(匿名函数)

var add = (a, b) => {
  return a + b;
};

var greet = name => {
  console.log("hello", name);
};

var greet2 = name => console.log("hello", name);

console.log(add(1, 2)); // 3
greet("world"); // hello world
greet2("world"); // hello world

# 柯里化(curry)

function add(a, b, c) {
  return a + b + c;
}
console.log(add(1, 2, 3)); // 6

// curry 就是将函数之前的值保存,缓存吗
function addCurry(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    };
  };
}

var towAdd = addCurry(1)(2);
console.log(towAdd); // f
console.log(towAdd(3)); // 6
console.log(towAdd(4)); // 7
console.log(towAdd(5)); // 8

# 自执行函数

有自己的作用域

var num1 = 10;
(function() {
  var num1 = 20;
  console.log(num1); // 20
})();
console.log(num1); // 10

# 回调函数

function request(callback) {
  console.log("请求数据");
  callback("success");
  console.log("请求结束");
}

// 可复用
// function callback(msg) {
//   console.log("执行回调函数");
//   console.log("执行结果是:" + msg);
// }

request(msg => {
  console.log("执行回调函数");
  console.log("执行结果是:" + msg);
});